package org.xianyu.controller;


import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import org.xianyu.commom.PageResult;
import org.xianyu.domain.entity.Order;
import org.xianyu.domain.enums.OrderStatus;
import org.xianyu.service.OrderService;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 提供 REST API：
 * GET /api/orders            - 查询（支持 query 参数过滤/排序）
 * GET /api/orders/{id}       - 根据 id 查询
 * POST /api/orders           - 创建
 * PUT /api/orders/{id}       - 更新（id 在路径中）
 * DELETE /api/orders/{id}    - 删除
 */
@RestController
@RequestMapping("/api/orders")
public class OrderController {
    private final OrderService service;

    /**
     * 构造函数，注入 OrderService 实例
     *
     * @param service 订单服务实例
     */
    public OrderController(OrderService service) {
        this.service = service;
    }

    /**
     * 查询订单列表，支持按产品名称、状态过滤以及排序
     *
     * @param product 产品名称，可选
     * @param status  订单状态，可选
     * @param sortBy  排序字段，可选
     * @param sortDir 排序方向（asc/desc），可选
     * @return 符合条件的订单列表
     */
    @GetMapping
    public List<Order> list(
            @RequestParam(required = false) String product,
            @RequestParam(required = false) OrderStatus status,
            @RequestParam(required = false, name = "sortBy") String sortBy,
            @RequestParam(required = false, name = "sortDir") String sortDir
    ) {
        return service.list(product, status, sortBy, sortDir);
    }

    /**
     * 根据 ID 获取订单详情
     *
     * @param id 订单 ID
     * @return 对应的订单对象
     */
    @GetMapping("/{id}")
    public Order getById(@PathVariable Long id) {
        return service.getById(id);
    }

    /**
     * 创建新订单
     * 前端传入 JSON，orderTime、endTime 建议使用 "yyyy-MM-dd'T'HH:mm:ss" ISO 格式
     *
     * @param order 待创建的订单对象
     * @return 创建成功的订单对象
     */
    @PostMapping
    public Order create(@RequestBody Order order) {
        // 前端传入 JSON，orderTime、endTime 建议使用 "yyyy-MM-dd'T'HH:mm:ss" ISO 格式
        return service.create(order);
    }

    /**
     * 更新指定 ID 的订单信息
     *
     * @param id    要更新的订单 ID
     * @param order 包含更新数据的订单对象
     * @return 更新结果："updated" 表示成功更新，"not found" 表示未找到对应记录
     */
    @PutMapping("/{id}")
    public String update(@PathVariable Long id, @RequestBody Order order) {
        order.setId(id);
        int rows = service.update(order);
        return rows > 0 ? "updated" : "not found";
    }

    /**
     * 删除指定 ID 的订单
     *
     * @param id 要删除的订单 ID
     * @return 删除结果："deleted" 表示成功删除，"not found" 表示未找到对应记录
     */
    @DeleteMapping("/{id}")
    public String delete(@PathVariable Long id) {
        int rows = service.delete(id);
        return rows > 0 ? "deleted" : "not found";
    }



    /**
     * 分页查询接口：
     * GET /api/orders/page?page=1&size=10&product=...&status=...&sortBy=price&sortDir=desc
     *
     * page 从 1 开始；size 默认 10
     */
    @GetMapping("/page")
    public PageResult<Order> page(
            @RequestParam(required = false) String product,
            @RequestParam(required = false) OrderStatus status,
            @RequestParam(required = false) String sortBy,
            @RequestParam(required = false) String sortDir,
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size
    ) {
        return service.page(product, status, sortBy, sortDir, page, size);
    }



    /**
     * 按给定日期区间计算利润（只统计已收货 DELIVERED，并且 end_time 在 [start, end]）
     * GET /api/orders/stats/profit?start=2025-08-01&end=2025-08-10
     *
     * 日期格式：yyyy-MM-dd
     * 返回 JSON 示例： { "totalProfit": "1234.56" }
     */
    @GetMapping("/stats/profit")
    public Map<String, String> sumProfitByDate(
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date start,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date end
    ) {
        // 只统计已收货的订单（DELIVERED）
        BigDecimal totalProfit = service.sumProfitByEndTimeAndStatus(start, end, OrderStatus.DELIVERED);
        Map<String, String> map = new HashMap<>();
        // 以字符串返回，避免 JSON 丢失精度，前端以字符串解析或显示
        map.put("totalProfit", totalProfit.toPlainString());
        return map;
    }

    /**
     * 计算所有下单订单的总金额（SUM(price)），不区分状态
     * GET /api/orders/stats/totalAmount
     * 返回示例： { "totalAmount": "12345.67" }
     */
    @GetMapping("/stats/totalAmount")
    public Map<String, String> sumAllAmount() {
        BigDecimal totalAmount = service.sumAllPrice();
        Map<String, String> map = new HashMap<>();
        map.put("totalAmount", totalAmount.toPlainString());
        return map;
    }
}
